// 链表
const a = { val: 'a' }
const b = { val: 'b' }
const c = { val: 'c' }
const d = { val: 'd' }

a.next = b
b.next = c
c.next = d


// 遍历链表
let p = a;
while (p) {
  console.log(p.val)
  p = p.next
}

// 插入
const e = { val: 'e' }
c.next = e
e.next = d

// 删除
c.next = d

// JS中的原型链
// 原型链的本质是链表
// 原型链上的节点是各种原型对象，比如 Function.prototype,Object.prototype....
// 原型链通过 __proto__ 属性链接各种原型对象

// obj -> Object.prototype -> null
// func -> Function.prototype -> Object.prototype -> null
// arr -> Array.prototype -> Object.prototype -> null

const obj = {}
const func = () => { }
const arr = []

// 原型链知识点
// 如果 A 沿着原型链能找到B.prototype,那么instanceof B 为True

// 面试题
// 简述instanceof的原理，并用代码实现

// 分析： 如果A沿着原型链能找到B.prototype,那么 instanceof B为true
// 解法： 遍历A的原型链，如果找到B.prototype,返回为true,否则返回false

const instanceOf = (A, B) => {
  let p = A
  while (p) {
    if (p === B.prototype) {
      return true
    }
    p = p.__proto__
  }
  return false
}

// 题2
var foo = {}, F = function () { }

Object.prototype.a = 'value a'
Function.prototype.b = 'value b'

console.log(foo.a) // value a
console.log(foo.b) // undefinded

console.log(F.a)  // value a
console.log(F.b) // value a



// 使用链表指针获取JSON的节点值

const json = {
  a: {
    b: { c: 1 }
  },
  d: { e: 2 }
}

const path = ['a', 'b', 'c']

let p = json
path.forEach(k => {
  p = p[k]
})


// 链表总结
// 1，链表里的元素存储不是连续的，之间通过next连接
// 2，JS中没有链表，但可以用Object模拟链表
// 3，链表常用操作： 修改next, 遍历链表


// JS中的原型链也是一个链表
// 使用链表指针可以获取JSON的节点值